package gclib;

import gclib.Classes.TYPE;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Jason
 */
public class Feature {
//	public static enum TYPE{};
	public static enum KIND{ATTACK, UTILITY};
	public static enum USAGE{AT_WILL, ENCOUNTER, DAILY};//green bar, red bar, black bar
	public static enum KEYWORD_CATEGORIES{POWER_SOURCE, DAMAGE_TYPE, EFFECT_TYPE, ACCESSORIES};
	public static enum POWER_SOURCE{ARCANE, DIVINE, MARTIAL};
	public static enum DAMAGE_TYPE{ACID, COLD, FIRE, FORCE, LIGHTNING, NECROTIC, POISON, PSYCHIC, RADIANT, THUNDER};
	public static enum EFFECT_TYPE{CHARM, CONJURATION, FEAR, HEALING, ILLUSION, POISON, POLYMORPH, RELIABLE, SLEEP, STANCE, TELEPORTATION, ZONE};
	public static enum ACCESSORIES{IMPLEMENT, WEAPON};

	public static enum ACTION_TYPE{STANDARD_ACTION, MOVE_ACTION, IMMEDIATE_INTERRUPT, IMMEDIATE_REACTION, MINOR_ACTION, FREE_ACTION, NO_ACTION};
	public static enum ATTACK_TYPE{MELEE, RANGED, CLOSE, AREA};
	/**
	 * <h3>Melee</h3>
<p>A melee power affects a target (or targets) within
melee reach. Many melee powers require a weapon.
You make a separate attack roll against each target.</p>
<p><b>Melee weapon:</b> A melee attack power that has a
range of “weapon” allows you to attack a target within
the reach of the weapon you’re wielding. Some weapons
extend your reach beyond adjacent squares.</p>
<p><i>Example:</i> If you use a “Melee weapon” power while
you’re wielding a dagger, you can attack a target within
1 square of you. If you’re wielding a halberd (a reach
weapon), you can attack a target within 2 squares of
you.</p>
<p><b>Melee 1:</b> A melee power that has a range of 1 can
be used only on an adjacent target.</p>
<p><b>Melee touch:</b> A melee power that has a range
of “touch” can be used on any target you can reach.
(Some creatures larger than Medium size have a reach
of more than 1 square.)</p>
<h3>Ranged</h3>
<p>A ranged power affects a target (or targets) at a distance.
For details about how ranged attacks work, see
page 270.</p>
<p><b>Ranged weapon:</b> A ranged attack power that has a
range of “weapon” allows you to attack a target within
your weapon’s range (see the table on page 219). If the
target is farther away than normal range but within
long range, you take a –2 penalty to attack rolls.</p>
<p><i>Example:</i> If you use a “Ranged weapon” power with
a shortbow (normal range 15, long range 30), you take
a –2 penalty when attacking targets 16–30 squares
away, and you can’t attack creatures farther away than
30 squares.</p>
<p><b>Ranged [number]:</b> A ranged power that has a
range expressed as a number can be used on a target
within the indicated number of squares.</p>
<p><b>Ranged sight:</b> A ranged power that has a range of
“sight” can be used on any target within line of sight.
You still need line of effect to the target.</p>
<h3>Close</h3>
<p>A close power creates an area of effect (page 272) that
originates in a square of your space, and most close
powers can hit multiple targets. For details about how
close attacks work, see page 271.</p>
<p><b>Close burst [number]:</b> A close burst power allows
you to target creatures or objects within the indicated
number of squares from you in all directions. See page
272 for how to determine the area of a burst.</p>
<p><b>Close blast [number]:</b> A close blast power allows
you to target creatures or objects within an adjacent
area that is the indicated number of squares on a side.
See page 272 for how to determine the area of a blast.</p>
<h3>Area</h3>
<p>An area power creates an area of effect (page 272) that
can originate in a distant square and hits multiple targets
or creates an obstacle. For details about how area
attacks work, see page 271.</p>
<p><b>Area burst [number] within [number] squares:</b>
To use an area burst power, choose a square within
the range indicated by the second number. The power
affects targets in that square or within a number of
squares equal to the first number.</p>
<p><b>Area wall [number] within [number] squares:</b>
To use an area wall power, choose a square within the
range indicated by the second number to be the wall’s
origin square (page 272). The first number represents
the number of squares the wall occupies (all of its
squares must be within range).<p>
<h3>Personal</h3>
<p>A power that has a range of “personal” affects only you.</p>
	 *
	 * @since PHB 4.0
	 */
	public static enum ATTACK_RANGE{WEAPON, TOUCH, SIGHT, NUMBER, BURST, BLAST, WALL, PERSONAL};

	private List<PowerKeyword> keywords = new ArrayList<PowerKeyword>(0);

	public List<PowerKeyword> getKeywords() {
		return keywords;
	}

	public void setKeywords(List<PowerKeyword> keywords) {
		this.keywords = keywords;
	}

//	private TYPE type;
	private USAGE usage;

	public USAGE getUsage() {
		return usage;
	}

	public void setUsage(USAGE usage) {
		this.usage = usage;
	}
	private Integer level;
	private String name;
	private Classes.TYPE classType;
	private KIND kind;
	private boolean classFeature;
	private String flavorText;
	private ACTION_TYPE actionType;
	private ATTACK_TYPE attackType;
	private ATTACK_RANGE attackRange;
	private Integer attackRangeValue;
	private Integer attackDistanceValue;
	private List prerequisite;//must have to obtain feature
	private List requirement;//must have to use feature
	/**
	 * <h3>Target</h3>
<b>Target:</b> One creature<br/>
<b>Target:</b> You or one ally<br/>
<b>Target:</b> Each enemy in burst<br/>
<b>Targets:</b> One, two, or three creatures<br/>
<b>Target:</b> One object or unoccupied square
<p>If a power directly affects one or more creatures or
objects, it has a “Target” or “Targets” entry.</p>
<p>When a power’s target entry specifies that it affects
you and one or more of your allies, then you can take
advantage of the power’s effect along with your teammates.
Otherwise, “ally” or “allies” does not include
you, and both terms assume willing targets. “Enemy”
or “enemies” means a creature or creatures that aren’t
your allies (whether those creatures are hostile toward
you or not). “Creature” or “creatures” means allies and
enemies both, as well as you.</p>
	 */
	private String target;

	private String attack;

	private String hit;

	private String miss;

	private String secondaryTarget;

	private String secondaryAttack;

	private List<Effect> effects = new ArrayList<Effect>(0);

	public ACTION_TYPE getActionType() {
		return actionType;
	}

	public void setActionType(ACTION_TYPE actionType) {
		this.actionType = actionType;
	}

	public String getAttack() {
		return attack;
	}

	public void setAttack(String attack) {
		this.attack = attack;
	}

	public Integer getAttackDistanceValue() {
		return attackDistanceValue;
	}

	public void setAttackDistanceValue(Integer attackDistanceValue) {
		this.attackDistanceValue = attackDistanceValue;
	}

	public ATTACK_RANGE getAttackRange() {
		return attackRange;
	}

	public void setAttackRange(ATTACK_RANGE attackRange) {
		this.attackRange = attackRange;
	}

	public Integer getAttackRangeValue() {
		return attackRangeValue;
	}

	public void setAttackRangeValue(Integer attackRangeValue) {
		this.attackRangeValue = attackRangeValue;
	}

	public ATTACK_TYPE getAttackType() {
		return attackType;
	}

	public void setAttackType(ATTACK_TYPE attackType) {
		this.attackType = attackType;
	}

	public boolean isClassFeature() {
		return classFeature;
	}

	public void setClassFeature(boolean classFeature) {
		this.classFeature = classFeature;
	}

	public TYPE getClassType() {
		return classType;
	}

	public void setClassType(TYPE classType) {
		this.classType = classType;
	}

	public List<Effect> getEffects() {
		return effects;
	}

	public void setEffects(List<Effect> effects) {
		this.effects = effects;
	}

	public String getFlavorText() {
		return flavorText;
	}

	public void setFlavorText(String flavorText) {
		this.flavorText = flavorText;
	}

	public String getHit() {
		return hit;
	}

	public void setHit(String hit) {
		this.hit = hit;
	}

	public KIND getKind() {
		return kind;
	}

	public void setKind(KIND kind) {
		this.kind = kind;
	}

	public Integer getLevel() {
		return level;
	}

	public void setLevel(Integer level) {
		this.level = level;
	}

	public String getMiss() {
		return miss;
	}

	public void setMiss(String miss) {
		this.miss = miss;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List getPrerequisite() {
		return prerequisite;
	}

	public void setPrerequisite(List prerequisite) {
		this.prerequisite = prerequisite;
	}

	public List getRequirement() {
		return requirement;
	}

	public void setRequirement(List requirement) {
		this.requirement = requirement;
	}

	public String getSecondaryAttack() {
		return secondaryAttack;
	}

	public void setSecondaryAttack(String secondaryAttack) {
		this.secondaryAttack = secondaryAttack;
	}

	public String getSecondaryTarget() {
		return secondaryTarget;
	}

	public void setSecondaryTarget(String secondaryTarget) {
		this.secondaryTarget = secondaryTarget;
	}

	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}
}
